/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.bbcnet.awesomeplayer;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.JTextComponent;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javazoom.jlgui.basicplayer.*;





/**
 *
 * @author Nicolo Singer
 */
class Wiedergabe extends JPanel implements BasicPlayerListener, ActionListener, ChangeListener{
    
    //für das GUI
    private JButton but_mode = new JButton("normal");
    private JSlider jpb = new JSlider();
    private JButton play = new JButton();
    private JButton next = new JButton();
    private JButton last = new JButton();
    private JTextPane field = new JTextPane();
    private JPanel panel = new JPanel();
    private int mode = 0;
    
    //für die Wiedergabe
    String playlist[];
    boolean isPlaying = false;
    private BasicPlayer player=new BasicPlayer();
    private int numberOfPlaying;
    private String stringOfPlaying;
    //checkt ob automatisch nach ende der Media gespult werden soll
    private boolean checker = false;
    private Table listenGUI;
     
    public Wiedergabe() {
          panel.setLayout(new GridLayout(2,1));
          setLayout(new GridLayout(3,1));
          
          SimpleAttributeSet set = new SimpleAttributeSet();
          StyleConstants.setAlignment(set,StyleConstants.ALIGN_CENTER);
          
          field.setBackground(null);
          field.setParagraphAttributes(set,true);
          
          last.setText("<<");
          play.setText(">");
          next.setText(">>");
          field.setText("--------");
          field.setEditable(false);
          last.addActionListener(this);
          play.addActionListener(this);
          next.addActionListener(this);
          player.addBasicPlayerListener(this);
          jpb.addChangeListener(this);
          jpb.setEnabled(false);
          
          //panels für << > >> und mode
          JPanel oben = new JPanel(new FlowLayout());
          JPanel unten = new JPanel (new FlowLayout());
          
          oben.add(last);
          oben.add(play);
          oben.add(next);
          
          but_mode.addActionListener(this);
          unten.add(but_mode);
          
          panel.add(oben);
          panel.add(unten);


          
          add(field);
          add(panel);
          add(jpb);
      
    }
    public void setTable(Table l){
        listenGUI = l;
    }
    /**
     * setzt den Focus in der Tabelle
     * @param a 
     */
    protected void setPoint(int a){
        if(listenGUI.table.getRowCount()==playlist.length){
            listenGUI.table.changeSelection(a, a, false, false);
        } 
    }
    //speilt das lied an der position a in der playlist ab
    /**
     * Spielt das Lied an der Position a der Playlist.
     * @param a Position der Playlist
     * @since AwesomePlayer 0.2
     */
    public void playThis(int a){
        setPoint(a);
        if(a>=0){
            try {
                player.stop();
                numberOfPlaying = a;
                stringOfPlaying = playlist[a];
                player.open(new File(stringOfPlaying));

                if(isPlaying == true){
                    player.play();
                }else{
                    player.play();
                    pause();
                }
            } catch (BasicPlayerException ex) { 

            }
            field.setText(stringOfPlaying);
            checker = false;
        }
    }
    //lässt ein pausiertes stück weiterspielen
    /**
     * lässt eine pausiertes Stück weiterspielen
     * @since AwesomePlayer 0.2
     */
    public void play(){
        try{
            player.resume();
            setIsPlaying(true);
        } catch (Exception e){
            
        }
    }
    //pausiert ein stück
    /**
     * Pausiert das Aktuelle Stück
     * @since AwesomePlayer 0.2
     */
    public void pause(){
        try{
            player.pause();
            setIsPlaying(false);
        } catch (Exception e){
            
        }
    }
    //stop das ganze (wird nie benötigt)
    /**
     * Stopt das Aktuelle Lied
     * @since AwesomePlayer 0.2
     */
    public void stopPlaying(){
        try{
            player.stop();
        } catch(Exception e){
            
        }
    }
    //nächstes lied in der liste wird abgespielt
    //mode 0= normal
    //mode 1= zufällig
    /**
     * Spielt das nächste Lied in der Liste an. Falls mode = 1 wählt es das nächste
     * Lied zufällig<br /><b>MERKE:</b><br /><code>setChecker(true);</code><br /> nicht vergessen
     * da sonst 2 Lieder gespult werden
     */
    public void next(){
        if(mode == 0){
            if(numberOfPlaying+1 > playlist.length-1){
                playThis(0);
            } else { 
                playThis(numberOfPlaying+1);
            }
        }else if(mode == 1){
            int zahl = (int)((Math.random()) * (playlist.length-1) + 1);
            playThis(zahl);
        }
    }
    //spielt letzes lied in der listea
    /**
     * Spielt das vorige Lied der Liste ab.<br /><b>MERKE:</b><br /><code>setChecker(true);</code>
     * <br />nicht vergessen
     */
    public void last(){
        if(numberOfPlaying-1 < 0){
            playThis(playlist.length-1);
        } else {
            playThis(numberOfPlaying-1);
        }
    }
    /**
     * gibt die aktuelle playlist zurück
     * @return String[]
     */
    public String[] getPlaylist(){
        
        return playlist;
    }
    //die playliste wird neu gesetzt.
    /**
     * Setzt die neue Playliste
     * @param a Sting[] Nur die Pfäde zu den Musik stücken angeben
     */
    public void setPlaylist(String[] a){
       playlist = a;
        
    }
    /**
     * setzt isPlaying auf false oder true
     * @param a boolean
     */
    public void setIsPlaying(boolean a){
        isPlaying = a;
        if(a==true){
            play.setText("||");
        }else{
            play.setText(">");
        }
    }
    /**
     * Vor jedem manuellen spulen aufrufen und auf true setzen. wird automaitsch
     * wieder auf false gesetzt
     * @param a boolean
     */
    public void setChecker(boolean a){
        checker = a;
    }
    /**
     * mode = 0 --> normal<br />
     * mode 0 1 --> zufällig
     * @param a int 1 / oder 0
     */
    public void setMode(int a){
        mode = a;
    }
    /**
     * Gibt zurück ob der Playler gerade am spielen ist
     * @return true/false
     */
    public boolean getIsPlaying(){
        return isPlaying;
    }
    
    

    @Override
    public Dimension getPreferredSize() {
        return (new Dimension(200,200));
    }
       
    @Override
    public void opened(Object o, Map map) {
        String k=map.get("audio.length.frames").toString();
        jpb.setMaximum(Integer.parseInt(k)-15);
    }
    
    //während dem spielen
    @Override
    public void progress(int i, long l, byte[] bytes, Map map) {
        String s=map.get("mp3.frame").toString();
        int k=(0-(Integer.parseInt(s))*(-1));
        jpb.setValue(k);
        
    }

    @Override
    public void stateUpdated(BasicPlayerEvent bpe) {
         if(bpe.getCode() == BasicPlayerEvent.STOPPED){
             //ist er true wurde vom benutzer aus gespult, dann soll nicht noch
             //einaml gespult werden. 
             if(checker == false){
                next();
             }
         }
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == play){
            if(isPlaying == false){
                play();
            } else if(isPlaying == true){
                pause();
            }
        } else if (e.getSource() == next){
                checker = true;
                next();
        } else if (e.getSource() == last){
            
            checker = true;
            last();            
        } else if (e.getSource() == but_mode){
            if(mode == 0){
                mode = 1;
                but_mode.setText("Zufällig");
            }else{
                mode = 0;
                but_mode.setText("Normal");
            }
        }
    }

    @Override
    public void stateChanged(ChangeEvent e) {
    
    }

    @Override
    public void setController(BasicController bc) {
        
    }
}
